package cn.mesmile.juc.callable;

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

/**
 * @author zb
 * @date 2021/8/16 17:41
 * @Description
 */
public class CallableThread {

    public static void main(String[] args) {
        // ①、将
        Callable<Integer> callable = new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                Thread.sleep(1000);
                System.out.println("Thread.currentThread().getName() = " + Thread.currentThread().getName());
                return 200;
            }
        };
        // ②、将 callable 实现类对象传递到 FutureTask 构造器中
        FutureTask<Integer> integerFutureTask = new FutureTask<>(callable);
        // ③、将 FutureTask 传递到 Thread 的构造器中
        Thread thread = new Thread(integerFutureTask);
        thread.setName("线程123");
        thread.start();

        // 先执行线程外的
        System.out.println(" = 111111111111111111111111");
        try {
            // 获取返回值【这里会等到任务完成之后，才会结束】
            // 这里会阻断主线程的操作，子线程执行完成之后，才会执行后面的步骤
            System.out.println("integerFutureTask.get() = " + integerFutureTask.get());
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(" = 22222222222222222222222");

        // 取消任务,如果尚未启动，它将停止任务。如果已启动，则仅在 mayInterrupt 为 true 时才会中断任务
        integerFutureTask.cancel(true);

        // 判断任务是否完成 ,如果任务完成，则返回 true，否则返回 false
        // 如果任务完成，它将立即返回结果，否则将等待任务完成，然后返回结果
        boolean done = integerFutureTask.isDone();
        System.out.println(">>>>>>>>>>>>> 任务是否完成 done = " + done);
    }

}

